home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / formats / iff / newiff.lzh / NewIFF / NewIFF.lzh / newiff / modules / bmprintc.c next >
C/C++ Source or Header  |  1992-05-18  |  5KB  |  187 lines

  1. /*--------------------------------------------------------------*/ 
  2. /*                                */ 
  3. /*            bmprintc.c                */ 
  4. /*                                */ 
  5. /* print out a C-language representation of data for bitmap    */ 
  6. /*                                */  
  7. /* By Jerry Morrison and Steve Shaw, Electronic Arts.        */ 
  8. /* This software is in the public domain.            */ 
  9. /*                                */ 
  10. /* This version for the Commodore-Amiga computer.        */ 
  11. /* Cleaned up and modified a bit by Chuck McManis, Aug 1988    */ 
  12. /* Modified 05/91 by CBM for use with iffparse modules          */
  13. /*                                */ 
  14. /*--------------------------------------------------------------*/ 
  15.  
  16. #include "iffp/ilbmapp.h"
  17. #include <stdio.h> 
  18.  
  19. #define NO  0 
  20. #define YES 1 
  21.  
  22. void PSprite(struct BitMap *bm, FILE *fp, UBYTE *name, int p, BOOL dohead);
  23. void PrCRLF(FILE *fp);
  24. void PrintBob(struct BitMap *bm, FILE *fp, UBYTE *name);
  25. void PrintSprite(struct BitMap *bm, FILE *fp, UBYTE *name,
  26.          BOOL attach, BOOL dohdr);
  27.  
  28. static BOOL doCRLF; 
  29. char sp_colors[] = ".oO@";
  30.  
  31. void PrCRLF(FILE *fp)  
  32.     if (doCRLF)  
  33.         fprintf(fp, "%c%c", 0xD, 0xA);  
  34.     else 
  35.         fprintf(fp, "\n"); 
  36.      
  37. void PrintBob(struct BitMap *bm, FILE *fp, UBYTE *name)  
  38.     register UWORD     *wp;    /* Pointer to the bitmap data */ 
  39.  
  40.     short     p,i,j,nb;    /* temporaries */ 
  41.     short     nwords = (bm->BytesPerRow/2)*bm->Rows; 
  42.      
  43.     fprintf(fp, "/*----- bitmap : w = %ld, h = %ld ------ */", 
  44.             bm->BytesPerRow*8, bm->Rows); 
  45.  
  46.     PrCRLF(fp); 
  47.      
  48.     for (p = 0; p < bm->Depth; ++p) {    /* For each bit plane */ 
  49.         wp = (UWORD *)bm->Planes[p]; 
  50.         fprintf(fp, "/*------ plane # %ld: --------*/", p); 
  51.         PrCRLF(fp); 
  52.         fprintf(fp, "UWORD %s%c[%ld] = { ", name, (p?('0'+p):' '), nwords); 
  53.         PrCRLF(fp); 
  54.         for (j = 0; j < bm->Rows; j++, wp += (bm->BytesPerRow >> 1)) {  
  55.             fprintf(fp, "    "); 
  56.             for (nb = 0; nb < (bm->BytesPerRow) >> 1; nb++) 
  57.                 fprintf(fp, "0x%04x,", *(wp+nb)); 
  58.             if (bm->BytesPerRow <= 6) { 
  59.                  fprintf(fp, "\t/* "); 
  60.                 for (nb = 0; nb < (bm->BytesPerRow) >> 1; nb++) 
  61.                     for (i=0 ; i<16; i++) 
  62.                         fprintf(fp, "%c", 
  63.                         (((*(wp+nb)>>(15-i))&1) ? '*' : '.')); 
  64.                 fprintf(fp, " */"); 
  65.             } 
  66.             PrCRLF(fp); 
  67.          
  68.         } 
  69.         fprintf(fp,"    };"); 
  70.         PrCRLF(fp); 
  71.     } 
  72.  
  73.  
  74.  
  75. void PSprite(struct BitMap *bm, FILE *fp, UBYTE *name, int p, BOOL dohead)  
  76.     UWORD     *wp0, *wp1;    /* Pointer temporaries     */ 
  77.     short     i, j, nwords,    /* Counter temporaries     */ 
  78.         color;        /* pixel color        */ 
  79.     short     wplen = bm->BytesPerRow/2; 
  80.  
  81.     nwords =  2*bm->Rows + (dohead?4:0); 
  82.     wp0 = (UWORD *)bm->Planes[p]; 
  83.     wp1 = (UWORD *)bm->Planes[p+1]; 
  84.  
  85.     fprintf(fp, "UWORD %s[%ld] = {", name, nwords); 
  86.     PrCRLF(fp); 
  87.  
  88.     if (dohead) { 
  89.         fprintf(fp,"  0x0000, 0x0000, /* VStart, VStop */"); 
  90.         PrCRLF(fp); 
  91.     } 
  92.     for (j=0 ; j < bm->Rows; j++) { 
  93.         fprintf(fp, "  0x%04x, 0x%04x", *wp0, *wp1); 
  94.         if (dohead || (j != bm->Rows-1)) { 
  95.             fprintf(fp, ","); 
  96.         } 
  97.         fprintf(fp, "\t/*  "); 
  98.         for (i = 0; i < 16; i++) { 
  99.             color = ((*wp1 >> (14-i)) & 2) + ((*wp0 >> (15-i)) & 1); 
  100.             fprintf(fp, "%c", sp_colors[color]); 
  101.         } 
  102.         fprintf(fp,"  */"); 
  103.         PrCRLF(fp); 
  104.         wp0 += wplen; 
  105.         wp1 += wplen; 
  106.     } 
  107.     if (dohead)  
  108.         fprintf(fp, "  0x0000, 0x0000 }; /* End of Sprite */"); 
  109.     else  
  110.         fprintf(fp," };");     
  111.     PrCRLF(fp); 
  112.     PrCRLF(fp); 
  113.  
  114. void PrintSprite(struct BitMap *bm, FILE *fp, UBYTE *name,
  115.          BOOL attach, BOOL dohdr)
  116.     fprintf(fp,"/*----- Sprite format: h = %ld ------ */", bm->Rows); 
  117.     PrCRLF(fp); 
  118.  
  119.     if (bm->Depth > 1) { 
  120.         fprintf(fp, "/*--Sprite containing lower order two planes:   */"); 
  121.         PrCRLF(fp); 
  122.         PSprite(bm, fp, name, 0, dohdr); 
  123.     } 
  124.     if (attach && (bm->Depth > 3) ) { 
  125.         strcat(name, "1"); 
  126.         fprintf(fp, "/*--Sprite containing higher order two planes:   */"); 
  127.         PrCRLF(fp); 
  128.         PSprite(bm, fp, name, 2, dohdr); 
  129.     }  
  130.  
  131. #define BOB     0 
  132. #define SPRITE     1 
  133.  
  134. /* BMPrintCRep
  135.  * Passed pointer to BitMap structure, C filehandle opened for write,
  136.  * name associated with file, and string describing the output
  137.  * format desired (see cases below), outputs C representation of the ILBM.
  138.  */
  139. void BMPrintCRep(struct BitMap *bm, FILE *fp, UBYTE *name, UBYTE *fmt)  
  140.     BOOL attach, doHdr; 
  141.     char c; 
  142.     SHORT type; 
  143.  
  144.     doCRLF = NO; 
  145.     doHdr = YES; 
  146.     type = BOB; 
  147.     attach = NO; 
  148.     while ( (c=*fmt++) != 0 )  
  149.         switch (c) { 
  150.             case 'b':  
  151.                 type = BOB;  
  152.                 break; 
  153.             case 's':  
  154.                 type = SPRITE; 
  155.                 attach = NO;  
  156.                 break; 
  157.             case 'a':  
  158.                 type = SPRITE;  
  159.                 attach = YES;  
  160.                 break; 
  161.             case 'n':  
  162.                 doHdr = NO;  
  163.                 break; 
  164.             case 'c':  
  165.                 doCRLF = YES;  
  166.                 break; 
  167.         } 
  168.     switch(type) { 
  169.         case BOB:  
  170.             PrintBob(bm, fp, name);  
  171.             break; 
  172.         case SPRITE:   
  173.             PrintSprite(bm, fp, name, attach, doHdr); 
  174.             break; 
  175.     } 
  176. }
  177.  
  178.